﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web;

/// <summary>
/// Summary description for DAL_DonThuoc
/// </summary>
public class DAL_DonThuoc : SqlConnectionRun
{
    private int _nErrorCode = -1;//that mean OK;
    public int ErrorCode_DAL { get { return _nErrorCode; } }

	public DAL_DonThuoc()
	{
		//
		// TODO: Add constructor logic here
		//
	}

    public DataSet LayDanhSachDonThuoc(string MaBN)
    {
        string sqlselect = @" select ''sdonthuoc,pk.mapk,convert(nvarchar(20),ngay,103) sngaykham, 
                            bacsikham hoten,chandoan from PhongKham..so_phieukham pk /*left join hanhchanhbv..nguoidung nd on nd.manv=pk.mabs*/ " +
                            " Where mabn = N'" + MaBN + "' order by ngay desc";
        DataSet ds = SqlExecuteQueryFillDataSet(sqlselect);
        
        string sqlselecta = @" select thuocid, TenThuoc,SoLuong,DonVi,pk.mapk 
                                from PhongKham..so_phieukham pk inner join ChiTiet_PhieuKham ct on pk.MaPK=ct.MaPK
				                Where mabn ='" + MaBN + "' order by ngay desc,id";
        DataSet _ds = SqlExecuteQueryFillDataSet(sqlselecta);

        int i = 0;
        string mpk = "";
        string chuoi = "";
        for (i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            mpk = ds.Tables[0].Rows[i]["mapk"].ToString();
            int j = 0;

            string _s1 = "", _s2 = "";
            string _mpk = "";
            int dem = 0;
            for (j = 0; j < _ds.Tables[0].Rows.Count; j++)
            {
                _mpk = _ds.Tables[0].Rows[j]["mapk"].ToString();
                if (mpk == _mpk)
                {
                    dem += 1;
                    _s1 = _ds.Tables[0].Rows[j]["thuocid"].ToString();
                    if (_s1 != _s2)
                    {
                        chuoi = chuoi + "-" + (dem) + ".&nbsp;" + _ds.Tables[0].Rows[j]["tenthuoc"].ToString() +
                        "&nbsp;:&nbsp;" + _ds.Tables[0].Rows[j]["soluong"].ToString() +
                        "&nbsp;" + _ds.Tables[0].Rows[j]["donvi"].ToString() +
                        "<br/>";
                        _s2 = _s1;
                    }

                }
                else { if (chuoi != "") { ds.Tables[0].Rows[i]["sdonthuoc"] = chuoi; chuoi = ""; } }
            }
        }
        if (i > 0) { ds.Tables[0].Rows[i - 1]["sdonthuoc"] = chuoi; chuoi = ""; }


        return ds;
    }

    public DataSet LayDonThuocCu(string DoiTuong, string _maph, string MaNV)
    {
        string sqlselect = "";
        if ((DoiTuong == "1") || (DoiTuong == "5"))
        {
            sqlselect = " exec PhongKham..proc_loaddonthuoccu '" + _maph + "','KhoBH','','" + MaNV + "'";
        }
        else
        {
            sqlselect = " exec PhongKham..proc_loaddonthuoccu '" + _maph + "','KhoDV','','" + MaNV + "'";
        }

        DataSet dt = SqlExecuteQueryFillDataSet(sqlselect);
        return dt;
    }

    public DataTable LayToaThuocTheoPhieuKham(string MaPhieu)
    {
        string sql = @"select ct.*, dm.thanhphan from chitiet_phieukham ct 
                      left join qlduoc_public..danhmucthuoc dm on ct.thuocid=dm.idthuoc 
                      where MaPK=N'" + MaPhieu + "' order by ID";
        DataTable dt = SqlExecuteQueryReader(sql);
        return dt;
    }

    public DataTable LayDanhSachDonThuocMau(string MaKhoa, string MaNV)
    {
        string strselect = @" Select pd.* from So_PhacDoDieuTri pd inner join 
                            HanhChanhBV..nguoidung nd on pd.mabs=nd.manv Where makhoa='"+ MaKhoa +"' or mabs='"+ MaNV +"' ";
        DataTable dt = SqlExecuteQueryReader(strselect);
        return dt;
    }

    /// <summary>
    /// Đơn thuốc mẫu
    /// </summary>
    /// <returns></returns>
    public DataTable LoadDanhSachPhacDo(string DoiTuongBN, string IDThuocMau, string MaNV)
    {        
        List<SqlParameter> parameters = new List<SqlParameter>();        
        switch(DoiTuongBN)
        {
            case "1":
            case "5":
                parameters.Add(new SqlParameter("@db1", "KhoBH"));
                parameters.Add(new SqlParameter("@db2", ""));
                break;
            default:
                parameters.Add(new SqlParameter("@db1", ""));
                parameters.Add(new SqlParameter("@db2", "KhoDV"));
                break;
        }
        parameters.Add(new SqlParameter("@mapd", IDThuocMau));
        parameters.Add(new SqlParameter("@MaND", MaNV));
        DataTable dt = SqlRunStoredProcedure("PhongKham..proc_loadphacdo", parameters);
        return dt;
    }

    public DataTable KiemTraPhanUngThuoc(string MaBN, string IDThuoc)
    {
        string SQL = "SELECT    Top 1 Th.TenThuoc, PUT.NoiDung" + "\n" +
                     "FROM      SINHHIEU..BN_PhanUngThuoc PUT" + "\n" +
                     "          LEFT JOIN QLDuoc_public..DanhMucThuoc Th ON PUT.IDThuoc = Th.IDThuoc" + "\n" +
                     "WHERE     PUT.MaBN = " + "N'" + MaBN + "'" + "\n" +
                     "          And PUT.IDThuoc = " + IDThuoc;
        DataTable dt = SqlExecuteQueryReader(SQL);
        return dt;
    }

    public DataTable KiemTraThanhPhanHoatChat(string MaBN, string IDThuoc)
    {        
       string SQL = "SELECT	DISTINCT A.IDHoatChat, A.TenHoatChat" + "\n" +
                 "FROM	(" + "\n" +
                 "     SELECT	ThHC.IDHoatChat, HC.TenHoatChat" + "\n" +
                 "     FROM	SINHHIEU..BN_PhanUngThuoc PUT" + "\n" +
                 "             INNER JOIN QLDuoc_public..DanhMucThuoc_HoatChat ThHC ON PUT.IDThuoc = ThHC.IDThuoc" + "\n" +
                 "             INNER JOIN QLDuoc_public..DanhMucHoatChat HC ON ThHC.IDHoatChat = HC.AutoID" + "\n" +
                 "     WHERE	PUT.MaBN = " + "N'" + MaBN + "'" + "\n" +
                 "     ) A" + "\n" +
                 "WHERE	A.IDHoatChat IN	(" + "\n" +
                 "                         SELECT	IDHoatChat" + "\n" +
                 "                         FROM	QLDuoc_public..DanhMucThuoc_HoatChat" + "\n" +
                 "                         WHERE	IDThuoc = " + IDThuoc + "\n" +
                 "                         )";
       DataTable dt = SqlExecuteQueryReader(SQL);
       return dt;
    }

    public DataTable KiemTraTuongTacThuoc(string IDThuoc)
    {
        string SQL = "SELECT   Th_HC.IDHoatChat, HC.TenHoatChat" + "\n" +
              "FROM     QLDuoc_public..DanhMucThuoc_HoatChat Th_HC" + "\n" +
              "         INNER JOIN QLDuoc_public..DanhMucHoatChat HC ON Th_HC.IDHoatChat = HC.AutoID" + "\n" +
              "WHERE    Th_HC.IDThuoc = " + IDThuoc + "\n";
        DataTable dt = SqlExecuteQueryReader(SQL);
        return dt;
    }

    public DataTable LayTheTrangNguoiBenh(string MaBN)
    {
       string SQL = "SELECT   Top 1 Thai, Bu, TreEm" + "\n" +
                  "FROM     SINHHIEU..tbl_thetrang" + "\n" +
                  "WHERE    MaBN = " + "N'" + MaBN + "'" + "\n" +
                  "ORDER BY ngay DESC";
       DataTable dt = SqlExecuteQueryReader(SQL);
       return dt;
    }

    public DataTable ChongChiDinhTheoTheTrangNguoiBenh(string TheTrang, string IDThuoc)
    {
        string SQL = "";
        switch(TheTrang)
        {
            case "Thai":
                SQL = "SELECT   ThHC.IDHoatChat, HC.TenHoatChat, HC.ChongChiDinh" + "\n" +
                          "FROM     QLDuoc_public..DanhMucThuoc_HoatChat ThHC" + "\n" +
                          "         INNER JOIN QLDuoc_public..DanhMucHoatChat HC ON ThHC.IDHoatChat = HC.AutoID" + "\n" +
                          "WHERE    ThHC.IDThuoc = " + IDThuoc + "\n" +
                          "         And HC.Thai = 1";
                break;
            case "TreEm":
                SQL = "SELECT   ThHC.IDHoatChat, HC.TenHoatChat, HC.ChongChiDinh" + "\n" +
                          "FROM     QLDuoc_public..DanhMucThuoc_HoatChat ThHC" + "\n" +
                          "         INNER JOIN QLDuoc_public..DanhMucHoatChat HC ON ThHC.IDHoatChat = HC.AutoID" + "\n" +
                          "WHERE    ThHC.IDThuoc = " + IDThuoc + "\n" +
                          "         And HC.TreEm = 1";
                break;
            case "Bu":
                SQL = "SELECT   ThHC.IDHoatChat, HC.TenHoatChat, HC.ChongChiDinh" + "\n" +
                         "FROM     QLDuoc_public..DanhMucThuoc_HoatChat ThHC" + "\n" +
                         "         INNER JOIN QLDuoc_public..DanhMucHoatChat HC ON ThHC.IDHoatChat = HC.AutoID" + "\n" +
                         "WHERE    ThHC.IDThuoc = " + IDThuoc + "\n" +
                         "         And HC.Bu = 1";
                break;
        }
        DataTable dt = SqlExecuteQueryReader(SQL);
        return dt;
    }

    public string LayChuThichThuoc(string IDHoatChat1, string IDHoatChat2)
    {
       string SQL = "SELECT   ChuThich" + "\n" +
                          "FROM     QLDuoc_public..BangTuongTacHoatChat" + "\n" +
                          "WHERE    (" + "\n" +
                          "         IDHoatChat1 = " + IDHoatChat1 + "\n" +
                          "         And IDHoatChat2 = " + IDHoatChat2 + "\n" +
                          "         )" + "\n" +
                          "         Or" + "\n" +
                          "         (" + "\n" +
                          "         IDHoatChat1 = " + IDHoatChat2 + "\n" +
                          "         And IDHoatChat2 = " + IDHoatChat1 + "\n" +
                          "         )";
       object result = SqlExecuteQueryScalar(SQL);
       if (result == null) 
           return "";
       else
           return result.ToString();
    }
   
    /// <summary>
    /// Thêm mới toa thuốc vào cơ sở dữ liệu, dưới SP có kiểm tra thuốc còn trong danh mục bảo hiểm và thuốc còn trong kho.
    /// </summary>
    /// <param name="_sMaPhieu">Mã phiếu khám</param>
    /// <param name="_nDoiTuong">Đối tượng BN.</param>
    /// <param name="_bCheckBaoHiem">True: có check xem trong toa có thuốc nào ngoài danh mục bảo hiểm. False: không check</param>
    /// <param name="_cSeperateSymbol">Ký tự phân tách mỗi thuốc trong chuỗi, mặc định là '|' </param>
    ///
    /// <param name="_sThuocID_s">Chuỗi chứa các mã thuốc trong toa cần thêm về DB</param>
    /// <param name="_sDbName_s">Chuỗi Tên kho bảo hiểm hay kho dịch vụ</param>
    /// <param name="_sTenThuoc_s">Chuỗi chứa các tên thuốc trong khoa</param>
    /// <param name="_sSoLuong_s">Chuỗi chứa số lượng các viên thuốc trong toa</param>
    /// <param name="_sDonVi_s">Chuỗi chứa đơn vị</param>
    /// <param name="_sCachDung_s">Cách dùng</param>
    /// <param name="_sLanDung_s">Lần dùng</param>
    /// <param name="_sLuongDung_s">Số lượng dùng trong mỗi lần </param>
    /// <param name="_sDonViDung_s">Đơn vị mỗi lần dùng</param>
    /// <param name="_sGhiChu_s">Ghi chú sử dụng thuốc</param>
    /// <param name="_sDonGia_s">Đơn giá thuốc</param>
    /// <returns>
    /// Nếu trùng thuốc thì trả về tên các thuốc trùng
    /// Nếu thuốc trong kho hết thì trả về tên các thuốc hết
    /// Nếu thuốc không có trong danh mục bảo hiểm thì trả về tên các thuốc không trong danh mục bảo hiểm
    /// </returns>
    public string addNewToaThuoc_DAL(string _sMaPhieuKham_Cu, string _sMaphieu, int _nDoiTuong, bool _bCheckBaoHiem, char _cSeperateSymbol, string _dbname_Static, string _sLoaiKham,
        string _sThuocID_s, string _sDbName_s, string _sSoLuong_s, string _sDonVi_s,
        string _sCachDung_s, string _sLanDung_s, string _sLuongDung_s, string _sDonViDung_s, string _sGhiChu_s)
		{
			string  sRetVal = "";
			string sMsg = "";

            string store = "PhongKham..usp_ToaThuoc_INSERT2";
            List<SqlParameter> parameters = new List<SqlParameter>();

            parameters.Add(new SqlParameter("@MaPhieuKham_Cu", _sMaPhieuKham_Cu));			
			parameters.Add(new SqlParameter("@MaPhieuKham",_sMaphieu));
			parameters.Add(new SqlParameter("@DoiTuong",_nDoiTuong));
			parameters.Add(new SqlParameter("@ChekBaoHiem",_bCheckBaoHiem));
			
			parameters.Add(new SqlParameter("@LoaiKham",_sLoaiKham));
			parameters.Add(new SqlParameter("@DBNameStatic",_dbname_Static));

			parameters.Add(new SqlParameter("@IdThuocs",_sThuocID_s)); 
			parameters.Add(new SqlParameter("@DBNames",_sDbName_s));
			
			parameters.Add(new SqlParameter("@SoLuongs",_sSoLuong_s));
			parameters.Add(new SqlParameter("@DonVis",_sDonVi_s)); 
			parameters.Add(new SqlParameter("@CachDungs",_sCachDung_s));
			parameters.Add(new SqlParameter("@LanDungs",_sLanDung_s)); 
			parameters.Add(new SqlParameter("@SoLuongDungs",_sLuongDung_s));
			parameters.Add(new SqlParameter("@DonViDungs",_sDonViDung_s)); 
			parameters.Add(new SqlParameter("@GhiChus",_sGhiChu_s));

            DataTable dt = SqlRunStoredProcedure(store, parameters);
			try
			{
				foreach(DataRow row in dt.Rows)
                {
                    if(Factory.emptyNull(row["msg"]) != "")
                        sMsg += row["msg"].ToString() + ",";
                    if (Factory.emptyNull(row["checkType"]) != "")
                        _nErrorCode = Int32.Parse(row["checkType"].ToString());
                }				
			}
			catch(SqlException ex)

			{
				_nErrorCode=-2;//unknown error
				sRetVal = "Loi DB" + ex.Message.ToString();
			}
			
			sMsg = sMsg.TrimEnd(',');
			switch(_nErrorCode){
				case -1:
					sRetVal = "Đã thêm toa thuốc thành công!";
					break;
				case 1:
					sRetVal = "Trùng tên thuốc:" + sMsg; 
					break;
				case 2:
					sRetVal = "Thuốc không có trong danh mục bảo hiểm:" + sMsg; 
					break;
				case 3:
					sRetVal = "Thuốc trong kho không đủ số lượng:" + sMsg; 
					break;
                case 11:
                    sRetVal = "Thuốc đã được kê trong đợt khám:" + sMsg;
                    break;
				default:
					sRetVal = sMsg;
					break;
			}
			
			return sRetVal;
		}

    
}
